package com.zhuangjie.security.utils;

import org.springframework.web.method.HandlerMethod;

import java.lang.annotation.Annotation;

/**
 * 反射的 Utils 函数集合
 * 提供访问私有变量, 获取泛型类型 Class, 提取集合中元素属性等 Utils 函数
 */
public class ReflectionUtils {
    /**
     * 获取注释
     *
     * @param handlerMethod   handler方法
     * @param annotationClass 注释类
     * @return {@link T}
     */
    public static  <T  extends Annotation> T getAnnotation(HandlerMethod handlerMethod, Class<T> annotationClass,boolean isOnNullFromType) {
        if (handlerMethod == null) return null;
        T targetAnnotation = handlerMethod.getMethodAnnotation(annotationClass);
        if (targetAnnotation == null && isOnNullFromType) {
            // 从类上获取注解
            targetAnnotation = handlerMethod.getBeanType().getAnnotation(annotationClass);
        }
        return targetAnnotation;
    }

    public static <T extends  Annotation> Boolean isHasAnnotation(HandlerMethod handlerMethod, Class<T> annotationClass,boolean isOnNullFromType) {
        return getAnnotation(handlerMethod,annotationClass,isOnNullFromType) != null;
    }
}